package ar.republicagroup.gestion.services;

import ar.republicagroup.gestion.entities.Cheque;
import ar.republicagroup.gestion.entities.Cliente;
import ar.republicagroup.gestion.entities.Liquidacion;
import ar.republicagroup.gestion.entities.LiquidacionDetalle;
import java.util.Date;
import java.util.List;

/**
 *
 * @author DIEGOALV
 */
public interface LiquidacionServices {
    
        public static final int CHEQUE_INGRESADO    = 1;
        public static final int CHEQUE_APROBADO     = 2;
        public static final int CHEQUE_RECHAZADO_1  = 3;
        public static final int CHEQUE_RECHAZADO_2  = 4;
        public static final int CHEQUE_RECHAZADO_3  = 5;
        public static final int CHEQUE_REDEPOSITADO = 6;
        public static final int CHEQUE_LIQUIDADO    = 7;
        public static final int CHEQUE_POSTERGADO   = 8;
    
    
        /* LiquidacionDAO */
        public List<Liquidacion> findEntities();
	
	public List<Liquidacion> getLiquidacionsByFilters(Cliente cliente,Date fechaDesde,Date fechaHasta);

        public String insert(Liquidacion beanLiquidacion);

        public String update(Liquidacion beanLiquidacion);

        public Liquidacion get(Integer id_cheque); 

        public String delete(Integer id_cheque);
        
        public Liquidacion getLastLiquidacionByCliente(Cliente cliente);
       
        /* Fin_LiquidacionDAO */
        
        
        /* Bussiness Logic */
        
        /**
         * Implementar este metodo para agregar un cheque a la liquidacion y sumar sus valores a los totales de una liquidacion
         * @param cheque Un objecto Cheque que se agrega a la liquidacion 
         * @see ar.republicagroup.gestion.entities.Cheque
         * @see ar.republicagroup.gestion.entities.Liquidacion
         */
        public void addChequeToLiquidacion(Cheque cheque);
    
        /**
         * Implementar este método para pasar un listado de cheques  aun listado de detalles de liquidacion y asociarlos a una Liquidacion
         * @param chequeList el listado de cheques que se van a agregar a un List<LiquidacionDetalle>
         * @param liquidacion a cada LiquidacionDetalle se le debe asociar este parametro 
         * @return List<LiquidacionDetalle> retorna un List de LiquidacionDetalle
         */
        public List<LiquidacionDetalle> convertirChequesAListDeDetalle(List<Cheque> chequeList,Liquidacion liquidacion);
        /**
         * Implementar este método para calcular el saldo actual que va a quedarle al cliente luego de realizar la liquidación .
         * El cálculo según la regla de negocio debe ser importePagado - (totalDeLiquidacion + saldoAnterior)
         * @param importePagado , es el importe real que paga Rgroup por una liquidación, puede ser mayor o inferior al totalDeLiquidacion
         * @param totalDeLiquidacion , es el total que debe pagar Rgroup a un cliente luego de una liquidación 
         * @param saldoLiquidacionAnterior, es el saldo de la última liquidación , que puede ser positivo o negativo , cuando es la primera la unicación de un cliente , este valor por defecto es 0 .
         */
        public double calcularSaldoActual(double importePagado,double totalDeLiquidacion,double saldoLiquidacionAnterior);
       
        
        public double getTotalLiquidacion();
        
        public double getTotalRechazados();
        
        public double getTotalComGestion();
        
        public double getTotalValoresAlCobroVC();
        
        public double getTotalValoresAlCobroCAP();
        
        public double getTotalRechazo1();
        
        public double getTotalRechazo2();
        
        public double getSaldoActual();
        
        public double getTotalRechazosCAP();
        
        public double getTotalRechazosVC();
        
        public double getTotalRechazos();
        
        public double getSubtotalGestion();
        
        /**
         * Retorna el importe de todos los cheques CAP + el importe total de rechazos de cheques CAP
         * @return el monto total en bruto de los cheques CAP incluido los rechazos de CAP .
         */
        public double getSubtotalCAP();
        
        /**
         * Retorna el importe de todos los cheques VC + el importe total de rechazos de cheques VC
         * @return el monto total en bruto de los cheques VC incluido los rechazos de VC .
         */
        public double getSubtotalVC();
        
        /**
         * Retorna la comisión a la que van a ser liquidados todos los cheques VC 
         * @return 
         */
        public double getComisionVC();
        
        /**
         * Retorna la comisión a la que van a ser liquidados todos los cheques CAP
         * @return 
         */
        public double getComisionCAP();
        
        public void setCliente(Cliente cliente);
        
        public Cliente getCliente();
        
        public int getNroDeChequesLiquidados();
        
        public int getNroDeChequesRechazados();
        
        public int getNroDeChequesPendientes();
        
        public int getNroTotalDeCheques();
       
        public void reiniciarTotales();
        
        
}
